package com.zjj.learn.designmodel.work.iterator;

public class IteratorTest {

    public static void main(String[] args) {
        Student student1 = new Student("001", "小美");
        Student student2 = new Student("002", "小娜");
        //向学生容器中添加两个学生
        StudentAggregate aggregate = new StudentAggregateImpl();
        aggregate.addStudent(student1);
        aggregate.addStudent(student2);
        //获取容器对象的迭代器，这里使用多态
        StudentIterator iterator = aggregate.getStudentIterator();
        //循环遍历迭代器中的对象，打印输出
        while (iterator.hasNeNext()){
            Student next = iterator.next();
            System.out.println("next = " + next);
        }
    }


    /**
     * 迭代器模式：行为型模式
     *     迭代器模式是一种行为型设计模式，它允许通过对集合对象进行迭代来访问集合中的元素，而不需要暴露集合内部的结构。
     *     在迭代器模式中，我们定义了一个迭代器接口，该接口封装了遍历集合元素的行为。
     *     集合对象实现该接口，并返回一个迭代器对象，该迭代器对象可以通过调用一系列方法来遍历集合中的元素。
     *
     * 例如：
     *    我们向定义了一个学生容器，可以向容器中添加学生、移除学生和遍历学生。就可以使用迭代器模式了
     *
     * 在迭代器模式中主要包括 4 中不同的角色：
     *   1、抽象迭代器：一般情况下，在迭代器中主要有两个抽象方法，判断是否存在下一个元素和获取当前元素
     *      {@link com.zjj.learn.designmodel.work.iterator.StudentIterator}
     *   2、具体迭代器：提供抽象迭代器中抽象方法的具体实现
     *      {@link com.zjj.learn.designmodel.work.iterator.StudentIteratorImpl}
     *   3、抽象聚合角色: 相当于就是容器对象，一般提供向容器中添加元素、移除元素和获取容器的迭代器对象
     *      {@link com.zjj.learn.designmodel.work.iterator.StudentAggregate}
     *   4、具体聚合角色：提供抽象容器对象中的额抽象方法的具体实现
     *      {@link com.zjj.learn.designmodel.work.iterator.StudentAggregateImpl}
     *
     * 测试：请见 {@link com.zjj.learn.designmodel.work.iterator.IteratorTest#main(String[])}
     *
     * 优缺点：
     *    优点：
     *      1、同一个容器对象可以提供多种不同的遍历方式。在迭代器模式中只需要提供一个不同的迭代器就可以实现不同的遍历。
     *         这里我们只需要为 StudentIterator 提供一个新的实现类，在重写抽象方法时修改 hasNext() 和 next() 方法即可
     *      2、简化了容器类，由于引入了迭代器，原有的容器中不需要提供具体的遍历方法了。
     *      3、待迭代器模式中，因为引入了抽象层，所以添加新的容器和迭代器就变得和容易。完全符合开闭原则
     *
     *    缺点：增加了类的个数，一定程度上增加了系统的复杂性。
     *
     **/
}
